package com.base.dao.impl;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import com.base.dao.IBaseDao;
import com.ssh.controler.TestAction;
import com.util.PageBean;

/**
 * 文  件  名:BaseDaoImpl.java
 * 创建日期:2012-8-28下午03:40:12
 * 作        者:guorui  东营东软电脑科技有限公司 版权所有
 * 说        明:
 */
@Repository
public class BaseDaoImpl implements IBaseDao {
	private final static Logger logger = LoggerFactory.getLogger(TestAction.class);
	@Resource
	private SessionFactory sessionFactory;
	
	/* (non-Javadoc)
	 * @see com.base.dao.IBaseDao#addObject(java.lang.Object)
	 */
	public void addObject(Object obj){  
		sessionFactory.getCurrentSession().save(obj);  
    }
	
	/**
	 * 根据传入的实体向数据库添加一条记录,返回插入记录的主键
	 * @param obj
	 * @return String
	 */
	public String addObjectPK(Object obj) {
		return (String) sessionFactory.getCurrentSession().save(obj);
	}
	
	/**
	 * 根据传入的实体修改数据库中一条记录
	 * @param obj
	 */
	public void updateObject(Object obj) {
		sessionFactory.getCurrentSession().update(obj);
	}

	/**
	 * 根据传入的实体修改数据库中一条记录,返回更新记录的主键
	 * @param obj
	 * @return String
	 */
	public String updateObjectPK(Object obj) {
		return this.addObjectPK(obj);
	}

	/**
	 * 根据传入的实体添加或修改数据库中一条记录
	 * @param obj
	 */
	public void addOrUpdate(Object obj) {
		sessionFactory.getCurrentSession().saveOrUpdate(obj);
	}
	
	/**
	 * 根据传入的实体从数据库删除一条记录
	 * @param obj
	 */
	public void deleteObject(Object obj) {
		sessionFactory.getCurrentSession().delete(obj);
	}

	/**
	 * 根据传入的实体与ID从数据库删除一条记录
	 * @param cls
	 * @param id
	 */
	@SuppressWarnings("rawtypes")
	public void deleteObject(Class cls, Serializable id) {
		this.deleteObject(sessionFactory.getCurrentSession().get(cls, id));
	}
	
	/**
	 * 根据ID返回一个对象
	 * @param cls
	 * @param id
	 * @return Object
	 */
	@SuppressWarnings("rawtypes")
	public Object findObjectById(Class cls, Serializable id) {
		return sessionFactory.getCurrentSession().get(cls, id);
	}

	/**
	 * 根据实体返回一个集合
	 * @param cls
	 * @return List
	 */
	@SuppressWarnings("rawtypes")
	public List findAllData(Class cls) {
		return sessionFactory.getCurrentSession().createQuery(" from " + cls.getName() + "").list();
	}

	/**
	 * 根据传入HQL语句返回一个集合
	 * @param hql
	 * @return List
	 */
	@SuppressWarnings("rawtypes")
	public List findListByHql(String hql) {
		return sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	/**
	 * 根据传入HQL语句与条件查询集合
	 * @param hql
	 * @param paramMap
	 * @return List
	 */
	@SuppressWarnings("rawtypes")
	public List findListByHql(String hql, Map paramMap) {
		Query query = sessionFactory.getCurrentSession().createQuery(hql);
		if (paramMap != null) {
			hqlArgs(paramMap, query);
		}
		return query.list();
	}
	
	/**
	 * 按传入HQL语句、条件、分页信息查询集合
	 * @param hql
	 * @param paramMap
	 * @param page
	 * @return List
	 */
	@SuppressWarnings("rawtypes")
	public List findListByHql(String hql, Map paramMap, PageBean page) {
		Query query = sessionFactory.getCurrentSession().createQuery(hql);
		if (paramMap != null) {
			hqlArgs(paramMap, query);
		}
		query.setFirstResult((page.getCurrentPage() - 1) * page.getPageRows());
		query.setMaxResults(page.getCurrentPage() * page.getPageRows());
		return query.list();
	}

	/**
	 * 根据传入实体对象返回总记录数
	 * @param cls
	 * @return int
	 */
	@SuppressWarnings("rawtypes")
	public int findIntRowCount(Class cls) {
		Query query = sessionFactory.getCurrentSession().createQuery(
				" select count(c.id) from " + cls.getName() + " c ");
		List list = query.list();
		int rowCount = ((Number) list.get(0)).intValue();
		return rowCount;
	}

	/**
	 * 根据传入HQL语句与条件查询记录总数
	 * @param hql
	 * @param paramMap
	 * @return int
	 */
	@SuppressWarnings("rawtypes")
	public int findIntRowCountByHqlName(String hql, String queryName, Map paramMap) {
		Query query = sessionFactory.getCurrentSession().createQuery(hql);
		if (paramMap != null) {
			hqlArgs(paramMap, query);
		}
		List list = query.list();
		int rowCount = ((Number) list.get(0)).intValue();
		return rowCount;
	}
	
	/** 
     * 强制刷新Hibernate缓存提交数据更改操作 
     */  
    public void dbFlush(){  
        sessionFactory.getCurrentSession().flush();  
    } 
    
    /** 
     * 为Hibernate查询设置参数 
     * @param argsMap 
     * @param query 
     */  
    @SuppressWarnings("rawtypes")
	public void hqlArgs(Map argsMap,Query query){  
        Iterator itKey = argsMap.keySet().iterator();  
        while(itKey.hasNext()){  
            String key = (String) itKey.next();  
            Object obj = argsMap.get(key);  
            if(obj instanceof List){  
                query.setParameterList(key,(List) obj);  
            }else{  
                query.setParameter(key,obj);  
            }  
        }  
    }  


	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}  
	
	
}
